home *** CD-ROM | disk | FTP | other *** search
- /*
- r.m=80 tab=4
- =======================================================================
- == <<バッチ分岐支援プログラム>> ==
- == [ select.exe ] Ver 0.10 ==
- == 1995 Program : Y.Gotoh ==
- =======================================================================
- */
-
- /*外部ファイル読み込み */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include <ctype.h>
- #include <gds.h>
- #include "gotoh.h"
-
- /* グローバル変数の設定 */
-
- int center=1; /* 選択肢の表示位置。初期(1)は中央 */
- int end_echo=0; /* エンディングエコーの表示非表示。初期(0)は非表示 */
- int g_clear=0; /* 実行後のグラフィックのクリア。初期(0)はしない。 */
- int under_bar=1; /* アンダーバー変換。初期(1)はする。*/
- int sel_color=3; /* 選択肢の色、初期(3)は黄色 */
-
- char *sel[20]; /* select群で使用 */
- char *help={ /* ヘルプメッセージ */
- "\n"
- " \"select.exe\" Ver 0.10 1995 : Y.Gotoh (Gori)\n"
- "\n"
- " select.exe [option] title sel_1 sel_b sel_c ・・・\n"
- " /b[r][g][b] ・・・ Back color [r],[g],[b]で背景を塗ります.\n"
- " /c[n] ・・・ selector Color カーソルの色を[n]に変更します.\n"
- " /e ・・・ Eending echo 終了時メッセージを表示します.\n"
- " /g ・・・ Graphic clear グラフィックを消去します.\n"
- " /h , /? ・・・ Help ヘルプを表示します.\n"
- " /l ・・・ at the Left 選択肢を左寄せにします.\n"
- " /_ ・・・ not change '_' アンダーバーを変換しません.\n"
- "\n"
- " ==メニューの使い方==\n"
- " [↑],[F],[E] ・・・・・・・・・・ カーソルを上へ移動\n"
- " [↓],[J],[X] ・・・・・・・・・・ 〃 下 〃 \n"
- " [ret],[space] ・・・・・・・・・・ 決定\n"
- " [0~9] ・・・・・・・・・・ その番号のメニューを実行\n"
- " [esc],[Q],[q] ・・・・・・・・・・ 終了\n\n"
- };
-
-
- /* 関数の定義 */
-
- /* 雑用関数 */
-
- void waitkey( int wait_time);
- void HELP( void );
- void center_puts( int y , char *msg);
-
- /* セレクト群関数 */
-
- int select(int sel_max);
- void select_list(int sel_max);
- void select_prt(int sel_no,int sel_bak);
- void select_cprt(int num);
-
- /* メイン */
-
- int main(int argc , char *argv[])
- {
- /* 初期設定 */
- int ret,sel_max=-1,i,j; /* sel_maxは後の所で修正されるため初期値 */
- /* は(-1)とする */
- int pal[3]={0,0,0}; /* 背景パレット */
- char dmy; /* 雑用char*/
-
- /* 画面消去・設定 */
-
- txt_cls();
- txt_csl(0); /* カーソル表示off */
- GDS_write_page(1); /* page1を使用 */
- GDS_display_page(1);
- if(g_clear)
- {
- GDS_all_clear();
- }
-
- /* パラメータの読み込み */
-
- if(argc<2) HELP(); /* パラメータ無しはヘルプ表示 */
-
- for(i=1;i<argc;i++)
- {
- if(*(argv[i])=='/' || *(argv[i])=='-') /* '/','-'のどちらにも対応 */
- {
- tolower( *(argv[i]+1) );
-
- switch(*(argv[i]+1))
- {
- case 'b':
- strlwr(argv[i]);
- for(j=2;j<strlen(argv[i]);j++)
- {
- dmy=*(argv[i]+j);
-
- if(dmy>=0x61 && dmy<=0x66) /* a~fは10~15へ */
- {
- pal[j-2]=(9+(dmy-0x60))*16;
- }
- else pal[j-2]=(atoi(&dmy))*16;
- }
- GDS_palette(0,pal[0],pal[1],pal[2]);
- break;
-
- case 'c':
- dmy=*(argv[i]+2);
- if(dmy>=0x30 && dmy<=0x37)
- {
- sel_color=atoi(&dmy);
- }
- else sel_color=3;
- break;
-
- case 'e': /* 終了メッセージを表示する */
- end_echo=1;
- break;
-
- case 'g': /* G画面の消去をする */
- g_clear=1;
- break;
-
- case 'h': /* ヘルプ */
- case '?':
- HELP();
- break;
-
- case 'l':
- center=0; /* 選択肢を左寄せ */
- break;
-
- case '_': /* アンダーバー変換をしない */
- under_bar=0;
- break;
-
- default:
- printf("オプション[%c]には未対応.\n",*(argv[i]+1));
- waitkey(10);
- }
- }
- else
- {
- sel_max++;
- sel[sel_max]=argv[i];
- }
- }
-
- if(sel_max<2)
- {
- txt_color(1); /* 赤 */
- printf("\nerror!! 選択肢の数が足りません!!\n");
- txt_color(7); /* 白 */
- HELP();
- }
-
- if(under_bar) /* under_barが0なら処理をしない */
- {
- for(i=0;i<=sel_max;i++)
- {
- for(j=0;j<strlen(sel[i]);j++) /* アンダーバーをス */
- { /* ペースに変換する。 */
- if( *(sel[i]+j)=='_' )
- {
- *(sel[i]+j)=' ';
- }
- }
- }
- }
-
- /* タイトル */
- locate(20,1);
- txt_color(3);
- printf( "------------------------------------------\n");
- locate(20,2);
- printf( " [select,exe] 1995 program : Y.Gotoh \n");
- locate(20,3);
- printf( "------------------------------------------\n");
- txt_color(7);
-
- /* メイン */
-
- ret=select(sel_max); /* 選択ルーチンへ */
- if(ret==-1) ret=0; /* エスケープ終了は通常終了にする */
-
- /* 終了処理 */
-
- txt_cls();
- if(end_echo) /* end_echo が 0 以外ならメッセージ表示 */
- {
- printf( "[select.exe] Ver 0.10 program : Y.Gotoh\n"
- " returned error level [%d]\n",ret);
- }
- txt_csl(1); /* カーソルの表示 */
- if(g_clear) GDS_palette(0,0,0,0); /* g_clearが0以外なら画面消去 */
- exit(ret);
- }
-
- /* ヘルプを表示するサブ */
- void HELP(void)
- {
- printf("%s",help);
- exit(0);
- }
-
- /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
- int select(int sel_max)
- {
- int sel_no=1,sel_bak=1,ret=0;
- char key='\0'; /* とりあえずループさせるために */
-
- center_puts(5,sel[0]); /* タイトル表示 */
-
- select_list(sel_max); /* 一覧表示 */
- select_prt(sel_no,sel_bak); /* 初期位置(1)にカーソルを持ってくる */
-
- do
- {
- key=getch();
- key=tolower(key);
-
- /* [↑,F,E]の時 */
- if(key=='\x1e' || key=='\x66' || key=='\x65')
- {
- sel_bak=sel_no;
- sel_no--;
- if(sel_no<1) sel_no=sel_max;
- select_prt(sel_no,sel_bak);
- }
-
- /* [↓,J,X]の時 */
- if(key == '\x1f' || key=='\x6a' || key=='\x78')
- {
- sel_bak=sel_no;
- sel_no++;
- if(sel_no>sel_max) sel_no=1;
- select_prt(sel_no,sel_bak);
- }
-
- /* 各数字(0~9)が押された時 */
- if(key >= '\x30' && key <= '\x39')
- {
- sel_bak=sel_no;
- sel_no=(int)key-0x30;
- if(sel_no==0) sel_no=10;
- if(sel_no>sel_max)
- {
- sel_no=sel_bak;
- }
- else
- {
- select_prt(sel_no,sel_bak);
- waitkey(20);
- key='\x0d';
- }
- }
- }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
-
- if(key == '\x0d' || key == '\x20' ) ret=sel_no; /* [space],[ret]なら
- 選択番号を返す */
- if(key == '\x71') ret=0; /* [Q],[q]なら終了(ret=0) */
- if(key == '\x1b') ret=-1; /* [esc]なら-1を返す */
-
- return(ret);
- }
-
- /* 選択肢一覧表示 */
- void select_list(int sel_max)
- {
- int i;
-
- for(i=1;i<=sel_max;i++)
- {
- if(center)
- {
- select_cprt(i);
- }
- else
- {
- locate(18,i+6);
- printf("%2d: %s",i,sel[i]);
- }
- }
- }
-
- /* 選択カーソル表示ルーチン */
- void select_prt(int sel_no,int sel_bak)
- {
- if(center)
- {
- select_cprt(sel_bak);
-
- printf("\x1b[7;%dm",sel_color+30); /* テキスト属性をリバースに */
- select_cprt(sel_no);
- printf("\x1b[0;37m"); /* 元に戻す */
- }
- else
- {
- /* 帯を消す */
- locate(18,sel_bak+6);
- printf("%2d: %s",sel_bak,sel[sel_bak]);
-
- /* 新しく帯を引く */
- locate(18,sel_no+6);
- printf("\x1b[7;%dm%2d: %s\x1b[0;37m",sel_color+30,sel_no,sel[sel_no]);
- }
- }
-
- void select_cprt(int num)
- {
- locate(18,num+6); /* 数字のみは左寄せで表示 */
- printf("%2d:",num);
-
- center_puts(num+6,sel[num]);
- }
-
- /* サブルーチン */
-
- /* 文字列を中央に表示するサブ */
- void center_puts(int y,char *msg)
- {
- int x=40-(strlen(msg)/2);
-
- locate(x,y);
- printf("%s",msg); /* 本来はputsを使用するが、このプログラムでそれを */
- /* するとファイルサイズの増加につながるために、pr */
- /* intfを使用 */
- }
-
- /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
- void waitkey(int wait_time)
- {
- int i=0;
-
- for(i=0;i<wait_time*10;i++)
- {
- if( kbhit() != 0) break;
- }
- }